
#include "sc_gui.h"

#define CPU_DMA_WAP      0           //DMA高低位交换

//底层接口，与lvgl接口一样
void LCD_DMA_color(int xs, int ys, int xe, int ye, u16 *color)
{
    u16 width=xe-xs+1;
    u16 higth=ye-ys+1;
    u16 i,len;

#if CPU_DMA_WAP
    len=width*higth;
    for(i=0; i<len; i++)
    {
        if(color[i])
        {
            color[i]=color[i]>>8|color[i]<<8;    //高低位WAP
        }
    }
    //----------------DMA接口------------------
    while(JL_SPI1->CON& (1<<13))                //放在LcdSelectWindows之前
    LCD_SetWindows(xs, ys,xe, ye);
    LCD_DMA_write_buf((u8*)color,len*2);
#else
    //-----------------无DMA------------------------
    //  LCD_SetWindows(xs, ys,xe, ye);
    for(int y = ys; y < ys+higth; y++)
    {
        for(int x = xs; x < xs+width; x++)
        {
            gui->bsp_pset (x,y,*color);
            //LCD_WR_DATA_16Bit(*color);	//写入数据
            color++;
        }
    }
#endif
}

/******************************Alpha*******************************/
static u32 bc_Alpha,fc_Alpha,c_sum;     //临时变量快速运算alpha算法
//快速运算alpha算法 0-256
u32 SC_AlphaBlender(u16 fc,u16 bc,int Alpha)
{
    u32  result;
    if(Alpha<16)
    {
        return bc;
    }
    else if(Alpha>240)
    {
        return fc;
    }
    result=Alpha>>3;            //RGB565只有5位色
    if(c_sum!=(fc-bc))          //减少重复运算
    {
        c_sum=fc-bc;
        fc_Alpha = ( fc | ( fc<<16 ) ) & 0x7E0F81F;
        bc_Alpha = ( bc | ( bc<<16 ) ) & 0x7E0F81F;
    }
    result=((fc_Alpha - bc_Alpha) * result)>>5;
    result  = (result+bc_Alpha)& 0x7E0F81F;
    return (u32)(result&0xFFFF) | (result>>16);
}

//------------------------单色屏全BUF位图----------------------------------------
#if  LCD_SCREEN_BIT_BUF
//位图画布,320*240/8 约9K内存
u8  bit_buf[LCD_SCREEN_HEIGHT][LCD_SCREEN_WIDTH/8];
//位图画点
void SC_bit_pset(int xs,int ys,u16 dat)
{
    u16 temp,xb,x;
    xs=(xs+LCD_SCREEN_WIDTH)%LCD_SCREEN_WIDTH;
    ys=(ys+LCD_SCREEN_WIDTH)%LCD_SCREEN_WIDTH;
    xb=xs%8;
    x=xs/8;
    temp=bit_buf[ys][x];
    if(dat)
    {
        temp|=(0x80>>xb);
    }
    else
    {
        temp&=~(0x80>>xb);
    }
    bit_buf[ys][x]=temp;
}

//位图刷新
void SC_bit_Refresh(int xs,int ys,int xe,int ye)
{
    int x,y;
    u8 a,i=0;
    u8 *map;
   gui->state|= SC_STATE_IMAGE;     //
    for(x=xs; x<=xe; x++)            //纵向解析效率更高
    {
        map=&bit_buf[ys][x/8];
        i=x%8;
        for(y=ys; y<=ye; y++)
        {
            a=*map<<i;                  //alpha灰阶
            //a=(a&0x80)? a|(~0x80):0;
            if(a&0x80)
            {
               Dma_pset(x,y,gui->fc);
            }
            else
            {
               Dma_pset(x,y,gui->bc);
            }
            map+=LCD_SCREEN_WIDTH/8;    //纵向下一列
        }
        Dma_Refresh(x, ys,x, y-1);      //纵向输出
    }
    gui->state&=~SC_STATE_IMAGE;
}

//实心矩形填充区1,0
void SC_bit_FillFrame(int xs,int ys,int xe,int ye,u8 dat)
{
    int x,y;
    u8 a,i=0;
    u8 d;
    u8 *map;
    for(x=xs; x<=xe; x++)            //绘到位图
    {
        map=&bit_buf[ys][x/8];
        i=x%8;
        for(y=ys; y<=ye; y++)
        {
            d=1<<(7-i);
            if(dat)
                *map|= d;
            else
                *map&=~d;
            map+=LCD_SCREEN_WIDTH/8; //纵向下一列
        }
    }
    if(gui->Refresh) gui->Refresh(xs, ys,xs, ye);
}
#endif

////字体位图
//void SC_bit_bmp(u16 xs,s16 ys,u16 w,u16 h,u8* buf,u8 mode)
//{
//    u8 *map,dat[2];
//    s16 xe=xs+w;
//    s16 ye=ys+h;
//    u16 xa=(xs%8);
//    u16 xb=(xe)%8;
//    xs=xs/8;
//    xe=xe/8;
//    w=(w+7)/8;
//    for(s16 x=xs; x<=xe; x++)       //加一个循环
//    {
//        map=buf;
//        for(s16 y=ys; y<ye; y++)
//        {
//            if(x==xs)
//            {
//                dat[1]=bit_buf[y][x]>>(8-xa);
//            }
//            else
//            {
//                dat[1]=*(map-1);
//            }
//            dat[0]=*map;
//            dat[0]=*(u16*)dat>>xa;
//            map+=w;          //下一行
//            if(x==xe)       //处理最后不对齐
//            {
//                if(xb)
//                {
//                    bit_buf[y][x]&=(0xff>>xb);
//                    bit_buf[y][x]|=dat[0];
//                    continue;
//                }
//                else
//                {
//                    break;      //退出
//                }
//            }
//            bit_buf[y][x]=dat[0];
//        }
//        buf++;
//    }
//}
